package cn.biplam.front.template.pageFrame.mdManage;

import cn.biplam.common.paramters.SysCaption;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.UserInfo;
import cn.biplam.front.component.data.common.CaptionComp;
import cn.biplam.front.html.HtmlDiv;
import cn.biplam.front.html.HtmlValue;
import cn.biplam.front.html.base.Html;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Clear_Type;
import cn.biplam.front.html.base.Const.Float_Type;
import cn.biplam.front.htmlscript.script.PopupScript;
import cn.biplam.front.template.Template;
import cn.biplam.front.template.base.ButtonGroup;
import cn.biplam.front.template.base.SeperatorLine;
import cn.biplam.front.template.base.Button.Button_Type;

/**
 * 元数据管理操作区模板<br>
 * 用法1：用于MdPage无标题栏时,将按钮和信息区合并放入MdPage的Domain区域的样式<br>
 * 用法2：在弹出窗口内作为提交的内容<BR>
 * 	如果传入非null的submitScript则出现确定按钮，点击时执行submitScript并关闭传入的PopuoID对应的弹出窗口
 *  如果传入非null的returnScript则出现返回按钮，点击是执行returnScript并关闭传入的PopuoID对应的弹出窗口
 * <ul> 用法：
 *  <li> new MdOperator("页面ID","系统路径","用户信息","模板要放入的目标容器ID","确定按钮的提交脚本命令(如果为空则无确定按钮)") 创建模版 
 *  <li> this.putDomain("主区域内容")  放入主区域内容
 *  <li> this.putButton("放入按钮")
 *  <li> this.get() 获取模版
 * </ul>
 * 
 * @author 	WangSong 2009-6-5 上午11:17:11
 * @version 1.0
 */
public class MdOperate implements Template{

	/** 页面ID */
	private String ID;
	/** 系统路径 */
	private String sHomeUrl;
	/** 用户信息 */
	private UserInfo mUser;
	/** 目标弹出窗口容器ID*/
	private String popupID;
	/** 提交脚本命令*/
	private String submitScript;
	/** 返回时脚本命令*/
	private String returnScript;
	/** 本模板主界面页面容器*/
	private HtmlWindow mdOperate;
	/** 分割线页面容器*/
	private HtmlWindow line;
	/** 按钮组页面容器*/
	private HtmlDiv buttonDiv;
	/** 按钮组 */
	private ButtonGroup buttons;
	/** 信息区页面容器*/
	private HtmlWindow mdoDomain;
	/** 记录ID */
	private String recordId;

	/**
	 * 创建元数据管理操作区模板(分为按钮组和信息区两部分)
	 * @param ID			页面ID
	 * @param sHomeUrl		系统路径
	 * @param mUser			用户信息
	 * @param popupID		弹出窗口ID(PopupScript.getPopupId)
	 * @param submitScript	提交脚本命令
	 * @param returnScript  返回时脚本命令
	 * @throws ErrorMessage
	 */
	public MdOperate(String ID,String sHomeUrl,UserInfo mUser,
			String popupID,String submitScript,String returnScript) throws ErrorMessage{
		this.ID=ID;
		this.mdOperate=new HtmlDiv(ID);
		this.line=new HtmlDiv(this.ID+"l");
		this.buttons=new ButtonGroup(null,Float_Type.Right);
		this.buttonDiv=new HtmlDiv(this.ID+"b","mdpb");
		this.mdoDomain=new HtmlDiv(this.ID+"d");
		this.sHomeUrl=sHomeUrl;
		this.mUser=mUser;
		this.popupID=popupID;
		this.submitScript=submitScript;
		this.returnScript = returnScript;
		this._putLine();
	}
	
	/**
	 * 创建元数据管理操作区模板(分为按钮组和信息区两部分)
	 * @param ID			页面ID
	 * @param sHomeUrl		系统路径
	 * @param mUser			用户信息
	 * @param popupID		弹出窗口ID(PopupScript.getPopupId)
	 * @param submitScript	提交脚本命令
	 * @throws ErrorMessage
	 */
	public MdOperate(String ID,String sHomeUrl,UserInfo mUser,
			String popupID,String submitScript) throws ErrorMessage{
		this(ID,sHomeUrl,mUser,popupID,submitScript,null);
	}

	/**
	 * 放入分割线
	 * @throws ErrorMessage
	 */
	private void _putLine() throws ErrorMessage{
		this.line.put(new SeperatorLine(sHomeUrl).get());
	}
	
	/**
	 * 放入默认的确定和取消按钮
	 * @throws ErrorMessage
	 */
	private void _putButton() throws ErrorMessage{
		//点击提交按钮时绑定的脚本
		if(this.submitScript!=null){
			this.putButton(null, SysCaption.Submit, Button_Type.Click, 
					PopupScript.submit(this.popupID, this.submitScript));
		}
		//点击返回按钮时绑定的脚本
		StringBuilder reScript = new StringBuilder();
		if(this.returnScript!=null){
			reScript.append(this.returnScript);
		}
		reScript.append(PopupScript.cancel(this.popupID));
		this.putButton(null, SysCaption.Return, Button_Type.Click, 
				reScript.toString());
	}
	
	/**
	 * 向模板中放入按钮(按自右向左顺序放入)
	 * @param captionID	标题名称ID	
	 * @param onClick	点击脚本命令
	 * @throws ErrorMessage 
	 */
	public void putButton(String captionID,String onClick) throws ErrorMessage{
		this.buttons.put(null, CaptionComp.get(this.mUser, captionID), Button_Type.Click, onClick);
	}
	
	/**
	 * 向模板中放入按钮(按自右向左顺序放入)
	 * @param buttonID	按钮ID
	 * @param captionID	标题名称ID	
	 * @param type		按钮类型	只读/可点击
	 * @param onClick	点击脚本命令
	 * @throws ErrorMessage 
	 */
	public void putButton(String buttonID,String captionID,Button_Type type,String onClick) throws ErrorMessage{
		this.buttons.put(buttonID, CaptionComp.get(this.mUser, captionID), type, onClick);
	}
	
	/**
	 * 向模板中放入按钮
	 * @param captionID	标题名称	
	 * @param type		按钮类型	只读/可点击
	 * @param onClick	点击脚本命令
	 * @throws ErrorMessage 
	 */
	public void putButton(String sCaption,Button_Type type,String onClick) throws ErrorMessage{
		this.buttons.put(sCaption, type, onClick);
	}
	
	/**
	 * 向模板信息区放入HtmlWindow对象
	 * @param domain
	 * @throws ErrorMessage
	 */
	public void putDomain(Html domain) throws ErrorMessage{
		this.mdoDomain.put(domain);
	}
	
	/**
	 *  设置主键记录ID
	 * @param recordId 记录ID
	 */
	public void setRecordId(String recordId){
		this.recordId = recordId;
	}
	
	/**
	 *  放入主键ID
	 */
	private void putRecordParam() throws ErrorMessage{
		if(this.recordId!=null){
			this.mdOperate.put(new HtmlValue(this.ID+"r",this.recordId));
		}
	}
	
	/**
	 * 返回模板HtmlWindow对象
	 * @return	HtmlWindow
	 * @throws ErrorMessage
	 */
	public HtmlWindow get() throws ErrorMessage {
		this._putButton();
		
		HtmlWindow bt=buttons.get();
		bt.setFloat(Float_Type.Right);
		buttonDiv.put(bt);
		
		this.mdOperate.put(buttonDiv);
		this.line.setClear(Clear_Type.Both);
		this.mdOperate.put(this.line);
		this.mdoDomain.setClear(Clear_Type.Both);
		this.mdOperate.put(this.mdoDomain);
		putRecordParam();//放入主键ID
		this.mdOperate.bind("mdOperateResize('"+this.ID+"');");
		return this.mdOperate;
	}

}
